Use case: SPI receive in DMA mode

Sequence diagram

SPI receive in DMA mode

  @startuml
  "Application"->"SPI" : HAL_SPI_Receive_DMA(&hspi1, aTxBuffer, DATA_TO_SEND);
  "SPI"-> "DMA" : HAL_DMA_Start_IT(&hspi1);
  "DMAx_IRQHandler" <- : DMAx half complete interrupt
  "DMAx_IRQHandler" -> "DMA" : HAL_DMA_IRQHandler(&hspi1);
  "DMA" -> "SPI" : XferHalfCpltCallback(&hspi1);

  "SPI"-> "Application" : HAL_SPI_RegisterCallback(&hspi1, HAL_SPI_RX_COMPLETE_CB_ID, USER_SPI_RxCpltCallback);
  @enduml

Code snippet

HAL1

HAL2

#define DATA_TO_RECEIVE_SIZE  255
uint8_t aRxBuffer[BUFFERSIZE];
SPI_HandleTypeDef hspi1;

HAL_SPI_RegisterCallback(&hspi1, HAL_SPI_RX_COMPLETE_CB_ID, USER_SPI_RxCpltCallback);

HAL_SPI_Receive_DMA(&hspi1, aRxBuffer, DATA_TO_RECEIVE_SIZE);
#define DATA_TO_RECEIVE_SIZE  255
uint8_t aRxBuffer[BUFFERSIZE];
hal_spi_handle_t hspi1;

HAL_SPI_RegisterRxCpltCallback(&hspi1, USER_SPI_RxCpltCallback);

HAL_SPI_Receive_DMA(&hspi1, aRxBuffer, DATA_TO_RECEIVE_SIZE);

Key changes

  1. RX complete callback registration changes from HAL_SPI_RegisterCallback(..., HAL_SPI_RX_COMPLETE_CB_ID, ...) to HAL_SPI_RegisterRxCpltCallback().

  2. HAL2 uses hal_spi_handle_t instead of SPI_HandleTypeDef.